iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Vue.js

Vue3 - 從零開始學系列 第 19

Vue3 - 從零開始學 - Day19 - 生命週期

  • 分享至 

  • xImage
  •  

生命週期指的就是一個 .vue 檔案,被瀏覽器載入完成所產生的一連串的執行順序。

除了先前幾個單元介紹的 data(){} 是宣告變數的地方,methods: {} 是宣告函式的地方,還有許多的其它的初始化的方法,如 beforeCreatecreatedbeforeMountmounted,看一下以下的範例:

<template>
  <button @click="show">Load Component</button>
  <Component v-if="isShow" />
  <br />
</template>

<script>
import Component from './components/Component.vue';

export default {
  name: 'App',
  components: {
    Component,
  },
  beforeCreate() {
    console.log('beforeCreate');
  },
  created() {
    console.log('created');
  },
  beforeMount() {
    console.log('beforeMount');
  },
  mounted() {
    console.log('mounted');
  },
  data() {
    return {
      isShow: false,
    };
  },
  methods: {
    show() {
      this.isShow = !this.isShow;
    },
  },
};
</script>

如果有這樣的宣告,其呼叫的順序會是:beforeCreate → created → beforeMount → mounted,也就是會先執行 beforeCreate 裡面的程式,然後才執行 created 裡面的程式,依序以此類推。

因為這裡有引用 Component.vue 這個元件,如果這個元件內也有一樣的宣告,如:

<template>
  <p>Component</p>
</template>

<script>
export default {
  name: 'Component',
  beforeCreate() {
    console.log('Component beforeCreate');
  },
  created() {
    console.log('Component created');
  },
  beforeMount() {
    console.log('Component beforeMount');
  },
  mounted() {
    console.log('Component mounted');
  },
};
</script>

那呼叫的順序會變成是, beforeCreate → created → beforeMount → Component beforeCreate → Component created → Component beforeMount → Component created → mounted。

另外如果有元件引用,還可以再加入兩個生命週期,beforeUpdate 與 updated,修改一下 App.vue:

<template>
  <button @click="show">Load Component</button>
  <Component v-if="isShow" />
  <br />
</template>

<script>
import Component from './components/Component.vue';

export default {
  name: 'App',
  components: {
    Component,
  },
  beforeCreate() {
    console.log('beforeCreate');
  },
  created() {
    console.log('created');
  },
  beforeMount() {
    console.log('beforeMount');
  },
  mounted() {
    console.log('mounted');
  },
  beforeUpdate() {
    console.log('beforeUpdate');
  },
  updated() {
    console.log('updated');
  },
  data() {
    return {
      isShow: false,
    };
  },
  methods: {
    show() {
      this.isShow = !this.isShow;
    },
  },
};
</script>

修改一下 components/Component.vue:

<template>
  <p>Component</p>
</template>

<script>
export default {
  name: 'Component',
  beforeCreate() {
    console.log('Component beforeCreate');
  },
  created() {
    console.log('Component created');
  },
  beforeMount() {
    console.log('Component beforeMount');
  },
  mounted() {
    console.log('Component mounted');
  },
  beforeUpdate() {
    console.log('Component beforeUpdate');
  },
  updated() {
    console.log('Component updated');
  },
};
</script>

因為 isShow: false,所以還不會呼叫元件的呼叫順序為:beforeCreate → created → beforeMount → mounted。

按下按鈕之後的順序會變成:beforeUpdate → Component beforeCreate → Component created → Component beforeMount → Component created → updated。

使用生命週期的好處是什麼?

就是可以分門別類要處理的邏輯,例如如果有呼叫 Server API 的話,通常會放在 created() {} 來呼叫。或者有 UI 的相關邏輯處理,會放在 mounted() {}

例如這個頁面會在一開始就直接將 foucs 放在 input 內:

<template>
  <!-- mounted -->
  <input type="text" ref="inputRef" />
</template>

<script>
export default {
  name: 'App',
  mounted() {
    console.log('mounted');

    //UI控制
    this.$refs.inputRef.focus();
  },
};
</script>

今日程式碼範例

Vue3 - 從零開始學 - Day19 [完]


上一篇
Vue3 - 從零開始學 - Day18 - 製作 Tab 瀏覽
下一篇
Vue3 - 從零開始學 - Day20 - 模組共用
系列文
Vue3 - 從零開始學31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Dylan
iT邦新手 1 級 ‧ 2023-09-28 20:32:23

有點疑問,父層的 mounted 應該在子層 mounted 後才觸發🤔

感謝你的指教,已經修正文章

0
owen6846
iT邦新手 5 級 ‧ 2024-09-26 09:53:19

關於文章中生命週期的呼叫的順序 Component created 打到兩遍了 後面那個應該是Component mounted

我要留言

立即登入留言